#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>



//信号集操作函数
//sigprocmask可以更改或者获取进程的信号屏蔽集（信号阻塞集）
int main()
{
    sigset_t block,odblock;

    //初始化信号集
    sigemptyset(&block);
    sigemptyset(&odblock);

    //屏蔽2号信号和40号信号
    sigaddset(&block,2);
    sigaddset(&block,40);

    //将进程的block表  改为block信号集（表）
    //odblock输出型参数，获取旧表
    int n=sigprocmask(SIG_SETMASK,&block,&odblock);

    int cnt=0;
    while(true)
    {
        std::cout<<"我是一个进程pid: "<<getpid()<<std::endl;
        //获取pending表
        sigset_t pending;
        sigpending(&pending);
        //打印pending表
        for(int i=41;i>=1;i--)
        {
            if(sigismember(&pending,i))
            {
                std::cout<<"1";
            }
            else
            {
                std::cout<<"0";
            }
        }
        std::cout<<std::endl;
        sleep(1);
    }

    return 0;
}
// struct sigaction {
//     void     (*sa_handler)(int);
//     void     (*sa_sigaction)(int, siginfo_t *, void *);
//     sigset_t   sa_mask;    //信号集
//     int        sa_flags;
//     void     (*sa_restorer)(void);
// };

//struct  sigaction
//使用sigaction自定义捕捉信号
// void handler(int signum)
// {
//     std::cout<<"捕捉信号："<<signum<<std::endl;
//     //获取 pending表
//     while(true)
//     {
//         sigset_t pending;
//         //获取pending表
//         sigpending(&pending);
//         for(int i=31;i>=1;i--)
//         {
//             //第i个信号是否处理
//             if(sigismember(&pending,i))
//             {
//                 std::cout<<"1";
//             }
//             else
//             {
//                 std::cout<<"0";
//             }
//         }
//         std::cout<<std::endl;
//         sleep(1);
//     }
//     exit(0);
// }
// int main()
// {
//     struct sigaction act,oact;
//     act.sa_handler=handler;

//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask,3);
//     sigaddset(&act.sa_mask,4);

//     //对2号信号进行捕捉，2,3,4号信号都屏蔽
//     sigaction(2,&act,&oact);//自定义捕捉信号,oact为输出型参数

//     while(true)
//     {
//         std::cout<<"hello world,pid: "<<getpid()<<std::endl;
//         sleep(1);
//     }

//     return 0;
// } 



// //自定义捕捉信号
// void sigcb(int sig)
// {
//     std::cout<<"收到信号:"<<sig<<",pid:"<<getpid()<<std::endl;
// }

// int main()
// {
//     for(int i=1;i<=31;i++)
//     signal(i,sigcb);
//     while(true)
//     {
        
//     }

//     return 0;
// }